% @author:夜剑听雨
% E-mail:2530595378@qq.com
% 2025.08.29
% 绘制反演频散曲线图
clear;clc;close all;
% 拾取值
load('./save_dir/pick/shot3_picked.mat');
pv1 = picked_data.velocity1;  % 拾取的基阶频散曲线
% 真实值
%% 速度递增4层模型
% Vs = [150 300 400 600];           % 横波速度(m/s)
% Thickness = [2 4 6];              % 地层厚度(m)
%% 低速夹层4层模型
% Vs = [250 120 350 500];           % 横波速度(m/s)
% Thickness = [4 2 4];              % 地层厚度(m)

%% 高速夹层4层模型
Vs = [100 200 500 400];           % 横波速度(m/s)
Thickness = [4 2 4];              % 地层厚度(m)

%% 计算数值模型的频散曲线解析解，理论频散曲线
Vp = [1000 1000 1000 1000];       % 纵波速度(m/s)
Den = [2000 2000 2000 2000];      % 地层密度(kg/m3)
Freq = 5:65;                     % 频率范围
% 所有输入值必须是行向量
phase_velocity2 = calcmulti(Freq,Vs,Thickness,Vp,Den);
pv2 = phase_velocity2(:,1);
% 反演值
load('./save_dir/Inv/PSO_Inv_model3.mat')
PSO_Inv_model = Inv_model;
PSO_mean = mean(PSO_Inv_model);
layNum = 4;
phase_velocity3 = calcmulti(Freq,PSO_mean(1:layNum), PSO_mean(layNum+1:end),Vp,Den);
pv3 = phase_velocity3(:,1);

%% 模型模拟拾取的频散曲线
figure;
% 观测值
Ind1 = find(pv1~=0);
% 绘制曲线
h1 = plot(Freq(Ind1), pv1(Ind1), 'r--','LineWidth', 1);
hold on; % 保持当前图形，以便在同一图形上绘制下一条曲线

% 真实值
Ind2 = find(pv2~=0);
% 绘制曲线r
h2 = plot(Freq(Ind2), pv2(Ind2), 'k-','LineWidth', 1);
hold on; % 保持当前图形，以便在同一图形上绘制下一条曲线
% 反演频散数据
Ind3 = find(pv3~=0);
% 绘制曲线
h3 = plot(Freq(Ind3), pv3(Ind3), 'b-','LineWidth', 1);
hold on; % 保持当前图形，以便在同一图形上绘制下一条曲线

% 设置y轴的范围和刻度
ylim([100 800]);
yticks(100:100:800);

% 设置x轴的范围和刻度
xticks(0:20:100);

xlabel('Frequency(Hz)','FontName', 'Microsoft YaHei', 'FontSize', 12);
ylabel('Phase velocity(m/s)','FontName', 'Microsoft YaHei', 'FontSize', 12);
% 设置坐标轴线宽
set(gca, 'Box', 'on', 'LineWidth', 1); % 设置边框为开启状态，并设置线宽
set(gca, 'LineWidth', 1);
% 添加图例
lgd = legend([h1, h2, h3], { 'Observed','True', 'Inversion'}, ...
    'Location', 'northeast','FontName', 'Microsoft YaHei', 'FontSize', 8);

lgd.Color = 'none';          % 完全透明背景
% 消除图片白边
set(gca,'LooseInset',get(gca,'TightInset')+0.01);
% 关闭hold状态
hold off;